char log_buf[2048];
};
+typedef struct caml_gc {
+ int offset;
+ void *ptrs[64];
+} caml_gc;
+
void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
int errnoval, const char *context, const char *format, va_list al)
{
{
}
+#define INIT_STRUCT() libxl_ctx ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
+
#define INIT_CTX() \
lg.logger.vmessage = log_vmessage; \
lg.logger.destroy = log_destroy; \
caml_raise_with_string(*caml_named_value("xl.error"), s);
}
-static int string_string_tuple_array_val (char ***c_val, value v)
+static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
{
CAMLparam1(v);
CAMLlocal1(a);
CAMLreturn(0);
}
-static int domain_create_info_val (libxl_domain_create_info *c_val, value v)
+static int domain_create_info_val (caml_gc *gc, libxl_domain_create_info *c_val, value v)
{
CAMLparam1(v);
CAMLlocal1(a);
a = Field(v, 5);
for (i = 0; i < 16; i++)
c_val->uuid[i] = Int_val(Field(a, i));
- string_string_tuple_array_val(&(c_val->xsdata), Field(v, 6));
- string_string_tuple_array_val(&(c_val->platformdata), Field(v, 7));
+ string_string_tuple_array_val(gc, &(c_val->xsdata), Field(v, 6));
+ string_string_tuple_array_val(gc, &(c_val->platformdata), Field(v, 7));
c_val->poolid = Int32_val(Field(v, 8));
c_val->poolname = String_val(Field(v, 9));
CAMLreturn(0);
}
-static int domain_build_info_val (libxl_domain_build_info *c_val, value v)
+static int domain_build_info_val (caml_gc *gc, libxl_domain_build_info *c_val, value v)
{
CAMLparam1(v);
CAMLlocal1(infopriv);
CAMLreturn(0);
}
-static int device_disk_val(libxl_device_disk *c_val, value v)
+static int device_disk_val(caml_gc *gc, libxl_device_disk *c_val, value v)
{
CAMLparam1(v);
CAMLreturn(0);
}
-static int device_nic_val(libxl_device_nic *c_val, value v)
+static int device_nic_val(caml_gc *gc, libxl_device_nic *c_val, value v)
{
CAMLparam1(v);
int i;
CAMLreturn(ret);
}
-static int device_console_val(libxl_device_console *c_val, value v)
+static int device_console_val(caml_gc *gc, libxl_device_console *c_val, value v)
{
CAMLparam1(v);
CAMLreturn(0);
}
-static int device_vkb_val(libxl_device_vkb *c_val, value v)
+static int device_vkb_val(caml_gc *gc, libxl_device_vkb *c_val, value v)
{
CAMLparam1(v);
CAMLreturn(0);
}
-static int device_vfb_val(libxl_device_vfb *c_val, value v)
+static int device_vfb_val(caml_gc *gc, libxl_device_vfb *c_val, value v)
{
CAMLparam1(v);
CAMLreturn(0);
}
-static int device_pci_val(libxl_device_pci *c_val, value v)
+static int device_pci_val(caml_gc *gc, libxl_device_pci *c_val, value v)
{
CAMLparam1(v);
CAMLreturn(0);
}
-static int sched_credit_val(libxl_sched_credit *c_val, value v)
+static int sched_credit_val(caml_gc *gc, libxl_sched_credit *c_val, value v)
{
CAMLparam1(v);
c_val->weight = Int_val(Field(v, 0));
CAMLreturn(0);
}
-static int domain_build_state_val(libxl_domain_build_state *c_val, value v)
+static int domain_build_state_val(caml_gc *gc, libxl_domain_build_state *c_val, value v)
{
CAMLparam1(v);
value stub_xl_domain_make(value info)
{
CAMLparam1(info);
- libxl_ctx ctx; struct caml_logger lg;
uint32_t domid;
libxl_domain_create_info c_info;
int ret;
+ INIT_STRUCT();
- domain_create_info_val (&c_info, info);
+ domain_create_info_val (&gc, &c_info, info);
INIT_CTX();
{
CAMLparam2(info, domid);
CAMLlocal1(result);
- libxl_ctx ctx; struct caml_logger lg;
libxl_domain_build_info c_info;
libxl_domain_build_state c_state;
int ret;
int c_domid;
+ INIT_STRUCT();
- domain_build_info_val (&c_info, info);
+ domain_build_info_val (&gc, &c_info, info);
c_domid = Int_val(domid);
INIT_CTX();
{
CAMLparam2(info, domid);
libxl_device_disk c_info;
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
- device_disk_val(&c_info, info);
+ device_disk_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
{
CAMLparam2(info, domid);
libxl_device_disk c_info;
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
- device_disk_val(&c_info, info);
+ device_disk_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
value stub_xl_nic_add(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_nic c_info;
int ret;
+ INIT_STRUCT();
- device_nic_val(&c_info, info);
+ device_nic_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
value stub_xl_nic_remove(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_nic c_info;
int ret;
+ INIT_STRUCT();
- device_nic_val(&c_info, info);
+ device_nic_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
value stub_xl_console_add(value info, value state, value domid)
{
CAMLparam3(info, state, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_console c_info;
libxl_domain_build_state c_state;
int ret;
+ INIT_STRUCT();
- device_console_val(&c_info, info);
- domain_build_state_val(&c_state, state);
+ device_console_val(&gc, &c_info, info);
+ domain_build_state_val(&gc, &c_state, state);
c_info.domid = Int_val(domid);
c_info.build_state = &c_state;
value stub_xl_vkb_add(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_vkb c_info;
int ret;
+ INIT_STRUCT();
- device_vkb_val(&c_info, info);
+ device_vkb_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
value stub_xl_vkb_clean_shutdown(value domid)
{
CAMLparam1(domid);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_device_vkb_clean_shutdown(&ctx, Int_val(domid));
value stub_xl_vkb_hard_shutdown(value domid)
{
CAMLparam1(domid);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_device_vkb_hard_shutdown(&ctx, Int_val(domid));
value stub_xl_vfb_add(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_vfb c_info;
int ret;
+ INIT_STRUCT();
- device_vfb_val(&c_info, info);
+ device_vfb_val(&gc, &c_info, info);
c_info.domid = Int_val(domid);
INIT_CTX();
value stub_xl_vfb_clean_shutdown(value domid)
{
CAMLparam1(domid);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_device_vfb_clean_shutdown(&ctx, Int_val(domid));
value stub_xl_vfb_hard_shutdown(value domid)
{
CAMLparam1(domid);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_device_vfb_hard_shutdown(&ctx, Int_val(domid));
value stub_xl_pci_add(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_pci c_info;
int ret;
+ INIT_STRUCT();
- device_pci_val(&c_info, info);
+ device_pci_val(&gc, &c_info, info);
INIT_CTX();
ret = libxl_device_pci_add(&ctx, Int_val(domid), &c_info);
value stub_xl_pci_remove(value info, value domid)
{
CAMLparam2(info, domid);
- libxl_ctx ctx; struct caml_logger lg;
libxl_device_pci c_info;
int ret;
+ INIT_STRUCT();
- device_pci_val(&c_info, info);
+ device_pci_val(&gc, &c_info, info);
INIT_CTX();
ret = libxl_device_pci_remove(&ctx, Int_val(domid), &c_info);
value stub_xl_pci_shutdown(value domid)
{
CAMLparam1(domid);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_device_pci_shutdown(&ctx, Int_val(domid));
value stub_xl_button_press(value domid, value button)
{
CAMLparam2(domid, button);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_button_press(&ctx, Int_val(domid), Int_val(button) + POWER_BUTTON);
{
CAMLparam1(unit);
CAMLlocal1(physinfo);
- libxl_ctx ctx; struct caml_logger lg;
libxl_physinfo c_physinfo;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_get_physinfo(&ctx, &c_physinfo);
{
CAMLparam1(domid);
CAMLlocal1(scinfo);
- libxl_ctx ctx; struct caml_logger lg;
libxl_sched_credit c_scinfo;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_sched_credit_domain_get(&ctx, Int_val(domid), &c_scinfo);
value stub_xl_sched_credit_domain_set(value domid, value scinfo)
{
CAMLparam2(domid, scinfo);
- libxl_ctx ctx; struct caml_logger lg;
libxl_sched_credit c_scinfo;
int ret;
+ INIT_STRUCT();
- sched_credit_val(&c_scinfo, scinfo);
+ sched_credit_val(&gc, &c_scinfo, scinfo);
INIT_CTX();
ret = libxl_sched_credit_domain_set(&ctx, Int_val(domid), &c_scinfo);
value stub_xl_send_sysrq(value domid, value sysrq)
{
CAMLparam2(domid, sysrq);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_send_sysrq(&ctx, Int_val(domid), Int_val(sysrq));
value stub_xl_send_debug_keys(value keys)
{
CAMLparam1(keys);
- libxl_ctx ctx; struct caml_logger lg;
int ret;
+ INIT_STRUCT();
INIT_CTX();
ret = libxl_send_debug_keys(&ctx, String_val(keys));